const Koa = require('koa')
const static = require('koa-static')
const mount = require("koa-mount")
const path = require('path')
const fs = require('fs')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger = require('koa-logger')

const router = require('./routes/index')

// swagger
const koaSwagger = require("koa2-swagger-ui").koaSwagger // koa2-swagger-ui
const swagger = require("./utils/swagger")

// error handler
onerror(app)

// middlewares
app.use(bodyparser({
  enableTypes: ['json', 'form', 'text']
}))
app.use(json())
app.use(logger())
// 静态资源访问
app.use(mount('/public', static(path.join(__dirname, './public'))), {
  maxage: 2 * 60 * 60, // 缓存时间：2小时
})
/**
 * 展示公共资源文件夹
 * 浏览器访问public路径可以得到public文件夹下所有文件夹列表
 * 不需要查看的可以注释掉，不影响静态资源全路径的使用
 * 例如：http://localhost:8901/public/upload/1686816901346.jpg
 **/
app.use(async (ctx, next) => {
  let dirpath = "./public"
  if (ctx.url.indexOf("/public") === 0) {
    //public 开头 读取文件
    const url = path.resolve(__dirname, dirpath)
    const fileBaseName = path.basename(url) // public
    const filepath = url + ctx.url.replace("/public", "")   //得到文件目录
    try {
      //判断是否是一个文件夹
      stats = fs.statSync(filepath)
      if (stats.isDirectory()) {
        const dir = fs.readdirSync(filepath)
        const ret = ['<div style="padding-left">']
        dir.forEach(filename => {
          //不带小数点的格式，就是文件夹
          if (filename.indexOf(".") > -1) {
            ret.push(
              `<p><a style="color:black" href="${ctx.url}/${filename}">${filename}</a></p>`)
          } else {
            //文件
            ret.push(`<p><a href="${ctx.url}/${filename}">${filename}</a></p>`)
          }
        })
        ret.push("</div>")
        ctx.body = ret.join("")
      } else {//访问到的是一个文件，则直接读取内容
        const content = fs.readFileSync(filepath)
        ctx.body = content
      }
    } catch (error) {
      ctx.body = '访问的资源不存在'
    }
  } else {
    //否则不是静态资源，直接去下一个中间件
    await next()
  }
})
// 服务静态文件，假设你的Vue项目构建后的文件在dist目录
app.use(static(path.join(__dirname, '/views/app/dist')))
app.use(static(path.join(__dirname, '/views/admin/dist')))

// 配置路由，使得对所有页面的请求都返回index.html
// 这是为了实现Vue-router的前端路由

// logger
app.use(async (ctx, next) => {
  const start = new Date()
  let arr = ctx.request.url.split('/')[1]
  if (arr === 'h5') {
    ctx.response.type = 'html'
    ctx.response.body = fs.createReadStream(path.join(__dirname, '/views/app/dist/index.html'))
  } else if (arr === 'admin') {
    ctx.response.type = 'html'
    ctx.response.body = fs.createReadStream(path.join(__dirname, '/views/admin/dist/index.html'))
  }
  await next()
  const ms = new Date() - start
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})

// 配置Swagger-ui
app.use(swagger.routes(), swagger.allowedMethods()) // 引入swagger-ui 路由
app.use(
  koaSwagger({
    routePrefix: "/swagger", // host at /swagger instead of default /docs
    swaggerOptions: {
      url: "/swagger.json", // example path to json
    },
  })
)
// routes
app.use(router.routes(), router.allowedMethods())

// error-handling
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
})

module.exports = app
